对于网站建设所有定位,最后都不免遇到这样一种情况:两个元素试图放在同一个位置上。显然,其中一个必须盖住另一个——不过,如何控制哪个元素放在“上层”呢?这就引人了属性z-index.
z-index
值:<integer> | auto | inherit
初始值auto
应用于定位元素
继承性 无
计算值 根据指定确定
利用z-index,可以改变于网站建设元素相互覆盖的顺序。这个属性的名字由坐标系统得来,其中从左向右是x轴,从上到下是y轴。在这种情况下,第三个轴一即从前向后,或者如果网页设计人员愿意,也可以理解为越来越远离用户——则称为z轴。因此,使用z-index 为元素指定沿z轴的值,并相应表示。图10-52描述了这个坐标系。
在这个坐标系中,有较高z-index值的元素比z-index值较低的元素离读者更近。这会导致有较高z-index值的元素覆盖其他元素,如图10-53所示,这是图10-52的正面图。这也称为叠放。
所有整数都可以用作为z-index的值,包括负数。如果为元素指定一个负z-index值,会将其移到到离读者更远的位置。也就是说,它会移到叠放栈的更低层。考虑以下样式,如图10-54所示:
p#first {position: absolute; Cop: 0; left: 0;
width: 20%; height: 10em; z-index: 8;}
p#second {position: absolute; top: 0; left: 10%;
width: 30%; height: 5em; z-index: 4;}
图10-52: z-index叠放的概念视图
图10-53:元素如何叠放
p#third {position: absolute; cop: 15%; left: 5%;
width: 15%; height: 10em; z-index: 1;}
p#fourth {position: absolute; top: 10%; left: 15%;
width: 40%; height: l0em; z-index: 0;}
图10-54:叠放元素可能相互重叠
每个网站建设元素都按照其样式定位,不过,z-index值修改了以往的叠放顺序。假设段落按数字顺序指定,一个合理的叠放顺序可能是(从低到高)p#first、p#second. pttthird、p#fourth。这会把p#first放在另外三个元素的下面,而把p#fourth放在所有元素的最前面。现在,因为有z-index属性,叠放顺序则在你的控制之下。
如前例所示,没有特别要求z-index值是连续的。可以指定任何整数。如果想确定一个元素必定在所有其他元素的前面,可以使用以下规则:z-index: 100000。大多数情况下,这都能满足你的要求,不过,如果把另一个元素的z-index声明为100001 (或更高),该元素则会出现在前面。
—旦为一个元素指定了z-index值,该元素就会建立自己的局部叠放上下文。这意味着,元素的所有后代相对于该祖先元素都有其自己的叠放顺序。这非常类似于元素建立新包含块的方式。给定以下样式,可以看到如图10-55所示的结果:
p {border: 1px solid; background:#DDD; margin: 0;}
b (background:#808080;}
em {background:#BBB;}
#one (position: absolute; cop: 0; left: 0; width: 50%; height: 10em; z-index: 10;}
#two {position: absolute,- top: 5em; left: 25%; width: 50%; height: 10em; z-index: 7;}
#Chree {position: absolute; top: Hem; left: 0; widtrh: 50%; height: 10em; z-index: 1;}
#one b {position: absolute; right:-5em; top: 4em; width: 20em; z-indexs -404;}
#two b {position: absolute; right:-3em; top: auto; z-index: 36;}
#two em tposition: absolute; bottom:-0.75em; left: 7em; right:-2em; z-index:-42;}
Kthree b {position: absolute; left: 3em; top: 3.5em; width: 25em; z-index: 23;}
图10-55:定位元素建立局部叠放上下文
注意b和em元素在叠放顺序中的位置。当然,这些元素都相对于其父元素准确定位,不过,要特别注意P#two的子元素。尽管b元素在其父元素前面,而em在后面,但它们都在p#three的前面!这是因为z-index值36和-42都相对于p#two,而不是相对于总的文档。从某种意义上讲,P#two及其所有子元素都有共同的z-index值7,而在这个P#two上下文中各元素又有其自己的“次级”z-index。
换句话说,就好像b元素的z-index为7,36,而em的z-index值为7,-42,这些只是网站建设的反映概念值,规范中没有相应的规定。不过,这样的系统有助于说明如何确定总的迭放顺序。请考虑:
p#one 10
p#one b 10,-404
p#two b 7,36
p#two 7
p#two em 7,-42
p#three b 1,23
p#three 1
这个概念框架准确地描述了这些元素以何种顺序叠放。从这个叠放顺序来看,尽管一个网站建设的元素后代可能在该元素的上面或下面,但它们与其祖先元素都归为一组。
如果一个元素为其后代元素建立了叠放上下文,而且该元素位于此上下文z轴的0位置上,也是如此。因此,可以将框架扩展如下:
P#one 10,0
p#one b 10,-404
P#two b 7,36
P#two 7,0
P#two em 7,-42
p#three b 1,23
p#three 1,0
还有一个值要分析。规范对默认值auto有以下说明:
当前叠放上下文中生成框的栈层次与其父框的层次相同。这个框不会建立新的局部4放上下文。(CSS2.1: 9.9.1)
因此,如果元素设置为z-index: auto,可以将其处理为z-index: 0。不过现在你可能想知道,如果一个元素是初始包含块叠放上下文的一部分,而且其z-index值为负,此时会发生什么情况。例如,可以想想看以下规则会得到什么结果:
<body>
<p style="position: absolute; z-index:-1;">Where am I?</p>
</body>
根据叠放规则,body元素与其父元素框在同一个迭放上下文中,因此将是0。它不会建立一个新的叠放上下文,所以绝对定位的P元素与body元素置于相同的迭放上下文中(即初始包含块的叠放上下文)。换句话说,段落放在body元素的后面(被body元素盖住)。如果body有不透明的背景,这个段落会消失。
不过,只是CSS2中会如此。在网站建设CSS2.1中,叠放规则有所改变,要求元素绝对不会迭放在其鲞放上下文的背景之下。换句话说,考虑以下情况,body元素为其后代建立了一个包含块(例如,假设它是相对定位元素)。作为body元素后代的一个绝对定位元素就不能叠放在body的背景之下,不过可以迭放在body的内容下面。
写作本书时,即使将body和html元素都设置为有透明的背景,Mozilla和相关浏览器也会完全隐藏段落。这种做法是错误的。即使body有背景,其他用户代理也会把段落放在body的背景之上。根据CSS2.1,这才是正确的行为。由于用户代理的做法不同,所以z-index值为负时会导致不可预料的后果,所以使用要小心,